草庐IT

Java final 与 C++ const

全部标签

c++ - 通过构造时获取的指针修改const对象

我刚刚发现在没有任何const_cast的情况下修改const对象是多么容易黑魔法。考虑:#includeclassTest{public:Test(intv):m_val{v},m_ptr{&m_val}{}intget()const{returnm_val;}voidset(intv)const{*m_ptr=v;}private:intm_val;int*m_ptr;};intmain(){constTestt{10};std::cout最新版本的Clang、GCC和MSVC不显示任何警告并产生预期的输出:100根据当前标准,这是明确定义的行为吗?如果未定义m_val会怎样类型为

C++11 类型推导与 const char *

在GotW94,HerbSutter对“经典C++”声明进行了区分constchar*s="Hello";和“现代”风格autos="Hello";他告诉我们“s的类型有细微差别,auto样式更正确”。[编辑添加:评论表明这可能不公平地表达Sutter的实际意思;请参阅下面的讨论。]但是……有什么区别?我的印象是constchar*是引用字符串文字的正确方法。此外,当我询问我的调试器(lldb)时,它似乎认为类型实际上是相同的:*thread#1:tid=0x1756c2,0x0000000100000f8ftest`main+31attest.cc:4,queue='com.appl

c++ - 如何将字符串文字传递给采用 const std::wstring& 的函数

我有一个采用conststd::wstring&font_family的函数,即FontFont::CreateFont(conststd::wstring&font_family){...}问题是我如何通过传递字符串文字(例如等宽)来调用该函数?我试过了CreateFont("monospace");CreateFont("std::wstring("monospace"));两者都不编译。谁有更好的主意?谢谢。 最佳答案 尝试:CreateFont(L"monospace");前导“L”指示编译器生成宽(wchar_t)字符串。

c++ - 使用 Arduino 将字符串转换为类型 const char*

我正在使用Arduino库。我想记录一些来自传感器的数据,为其添加日期时间戳并将其写入SD卡。建立文本文件名我试过StringdataFileName=String(String(sedClock.getTime().year(),DEC)+String(sedClock.getTime().month(),DEC)+String(sedClock.getTime().day(),DEC)+String(sedClock.getTime().hour(),DEC)+String(sedClock.getTime().minute(),DEC)+String(sedClock.getTi

c++ - const_cast<const Type*> 有用吗?

最近我发现一段C++代码可以有效地执行以下操作:char*pointer=...;constchar*constPointer=const_cast(pointer);显然作者认为const_cast表示“添加常量”,但实际上const也可以隐式添加:constchar*constPointer=pointer;在任何情况下我真的必须const_cast到一个指向常量的指针(const_cast,如上例)? 最佳答案 你有2个重载并且你想强制执行const一个。当您根据另一个来调用一个时,通常就是这种情况。classA{public

c++ - 返回 const 引用或引用的方法会导致内存泄漏吗?

我非常好奇从方法返回引用是否会导致内存泄漏。以下是示例情况。classexample{public:vector&get_vect(){returnvect;}int&get_num(){returnnum;}private:vectorvect;intnum;};voidtest_run(example&input){int&test_val=input.get_num();vector&test_vect=input.get_vect();}intmain(){exampleone;test_run(one);return0;}我的问题是test_val和test_vect在tes

c++ - 在具有 const/nonconst 版本的 C++ 模板类上重载 [] 运算符

哇,好长的标题。这是我的问题。我在C++中有一个模板类,我正在重载[]运算符。我有一个const和一个非常量版本,非常量版本通过引用返回,这样类中的项目就可以这样更改:myobject[1]=myvalue;这一切都有效,直到我使用bool值作为模板参数。这是显示错误的完整示例:#include#includeusingnamespacestd;templateclassMyClass{private:vector_items;public:voidadd(Titem){_items.push_back(item);}constToperator[](intidx)const{retu

c++ - 编译器是否不允许假定 const-ref 参数将保持常量?

例如:https://godbolt.org/g/5eUkrxvoidf(constint&);voidg1(){constinti=42;if(i==42)f(i);if(i==42)f(i);}voidg2(){inti=42;if(i==42)f(i);if(i==42)f(i);}似乎“f”改变其参数应该是UB,因此应该允许编译器假定它不会发生并相应地进行优化。然而这两个函数会产生不同的装配。我没有标准的拷贝。这不是保证吗? 最佳答案 根据标准,在C++中将一个指向常量的指针转换为指向非常量的指针,然后修改它(尽管这很困惑)

c++ - 为什么这个const成员函数允许修改一个成员变量呢?

classString{private:char*rep;public:String(constchar*);voidtoUpper()const;};String::String(constchar*s){rep=newchar[strlen(s)+1];strcpy(rep,s);}voidString::toUpper()const{for(inti=0;rep[i];i++)rep[i]=toupper(rep[i]);}intmain(){constStringlower("lower");lower.toUpper();cout 最佳答案

c++ - 如何将 "invalid operands of types ' const char' 修复为二进制 'operator+'?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIconcatenatemultipleC++stringsononeline?根据thisC++std::string使用operator+连接。那么为什么这段代码usingnamespacestd;stringsql="createtablem_table("+"pathTEXT,"+"qualityREAL,"+"foundINTEGER);";导致这个错误?invalidoperandsoftypes'constchar[22]'and'constchar[17]'tobinary'oper